Fork me on GitHub

《java web开发与应用》笔记

从C/S从到B/S

C/S即客户机/服务器,比如qq电脑版。B/S即浏览器/服务器,比如京东网页版。
◆问:C/S有哪些不足?
答:qq客户端有丰富的功能,网络上传递的一般只是数据本身,客户端收到数据之后,负责处理这些数据并进行显示。不过如果qq更新了一个钱包功能,必须通知客户端更新,就是我们平时经常跳出的更新提示。
◆问:如何解决这个间题?
解决办法实际上很简单:让界面的显示效果在服务器端生成,传给客户端;服务器传什么,客户端就显示什么,客户端不要参与太多数据处理。这样,管理员如果想内容修改了,也不需要通知客户端升级,客户端只需要安装负责显示的软件(浏览器),就可以了。
◆问:如何实现?
B/S模式。也分为客户机和服务器两层,但是客户机上不用安装软件,只需要使用浏览器即可,网络上传输的也不再是普通数据,而是将这些数据用HTML等技术进行处理之后的结果。
而Web网站最基本的要求是:必须使客户能够通过HTTP访问网站中的网页。比如,输人http://www.google.com,可以打开Google页面,说明Google就是Web网站。
怎样让用户能通过HTTP访问网页呢?很简单,只需将网页放在服务器中运行。当然,此处所讲的服务器是软件服务器(比如Tomcat),不是硬件服务器。

Cookie原理
Cookie翻译成中文是“小甜饼”的意思,它能够使客户在登录过程中摆脱烦琐的输入账号和密码的过程。 Cookie的原理如下
(1)当用户登录成功后,服务器将其登录信息(如账号、密码)保存在客户端硬盘上的一个小文件内。
(2)下次用户访问该网站,浏览器读取该小文件(即 Cookie)中的信息(如账号、密码)传给服务器。
(3)服务器对这些信息进行验证,如果验证通过,跳转到登录成功的页面。
注意:cookie是保存在客户端。并且下次登录不需要输入账号、密码,并不代表账号、密码不需要在服务器端验证。

MVC思想

想象一下,你用jsp为学校做好了一个学校教务系统。
有一天,学校突然决定,选课表单显示应该更美观一些,要改变显示方法。
由于计算机犯罪越来越多,要求在验证信息的时候多一些功能,如安全密钥等。
数据库迁移,数据库变成了不同的名字,表结构也改变了,查询时需要修改代码。
要解决这些问题,就必须把JSP的某一部分改掉。但是,编写代码时最忌讳的就是在很长的一段程序中修改很小的一部分,这样做代价很高,并且在开发过程中分工也很不方便。如:因此,该方案中,将页面设计和商业逻辑混合在一起,在修改时必须读懂所有代码。从网页编写者的角度讲,希望看到的是大量的标签而不是java。而编程人员也需要知道数据库的结构。美工人员修改显示方法时,需要面对大量数据库访问代码。,开发时bu便于分工。
基于该问题,可以将该JSP拆成三个模块来实现。
首先,编写JSP,负责输入查询代码,提交到 Servlet,。Servlet进行安全验证,调用DAO来访问数据库,得到结果,跳转到JSP显示这种方法。
虽然前期设计比较复杂,但有如下特点
1、适合分工,每一个程序员只需要关心他自己所需要关心的那个模块。
2、维护方便,比如需要修改其中的一个部分,就对相应的模块进行修改就可以了。
对比这两种方案,可以发现,第二种方案把程序分为不同的模块,显示、业务逻辑、过程控制都独立起来,使得软件在可伸缩性和可维护性方面有了很大的优势。如要改变外观显示,只需要修改JSP就可以了;修改验证方法,只需要修改 Servlet就可以了;数据库迁移,只需要修改DAO就可以了。这种思想就是MVC思想。

获取单选、双选、下拉菜单数据

单选

1
2
3
性别:
男 <input type="radio" name="sex" value="boy" >
女<input type="radio" name="sex" value="girl">

获取数据代码略

多选

1
2
3
4
5
6
7
8
9
10
11
唱歌<input name="fav" type="checkbox" value="singing">
跳舞<input name="fav" type="checkbox" value="dance">
打球<input name="fav" type="checkbox" value="ball">
打游戏<input name="fav" type="checkbox" value="game">
//注意4个多选input的name都为“fav”
获取数据代码:
<%String [] fav=request.getParameterValues("fav");
for (String s : fav) {
%>
<%=s%>
<% }%>

下拉菜单

1
2
3
4
5
<select name="home">
<option value="beijing">北京</option>
<option value="">上海</option>
<option value="">广州</option>
</select>

获取数据代码略

jsp有些功能用 JavaScript也能够实现,那有何区别?

答:最大的区别是, Java Script源代码是被服务器发送到客户端,由客户端执行,因此,客户端可以看到 JavaScript源代码;而Java代码却不会。你在开发者工具查看代码是看不到jsp页面中的Java代码的。

为什么需要url传值?

比如教务系统中,每个学生信息后面的删除按钮。点击之后会跳转到删除操作页面。但如何知道要删除哪个学生呢?这就需要在url跳转的时候顺便把要删除的学生学号传过去。当然,也可以传给本页面。
删除
删除
再比如说,让你写一个页面,上有10个链接,分别是1 2 3 4 5 6 7 8 9 10,单击相应的链接,在底部打印相应的乘法表。如点击4打印四四乘法表。url传值就派上用场了。
如果传值是中文会出现乱码问题,传值和取值支付URLEncoder.encode()和URLEncoder.decode()分别进行编码和解码

为什么需要include指令?

比如版权信息,你不可能每个页面每个页面的复制吧,如果有变动岂不是每个都要改?

include指令和include动作的区别

<%@include file=”info.jsp”%>include指令不会实时更新
<jsp:include page=”info.jsp” />include动作会实时更新
include指令在JSP编译时就将对应的文件包含进来。而 include动作则不同,其会在客户端对JSP文件发出请求的时候将对应包含文件的输出包含进来。include动作还会自动检查被包含文件的变化。也就是说,当被包含资源的内容发生
变化的时候,使用 include指令的话,服务器可能不会检测到,所以不会对其进行重新的编译,这给维护带来了巨大的麻烦。include动作则可以在每次客户端发出请求时重新把资源包含进来,进行实时的更新。

其他

URL传值会在浏览器的地址栏中看到传递的信息;
隐藏表单会在客户端页面的源代码中看到传递的信息;
Cookie会在客户端页面的文本文件中看到传递的信息。

检查用户提交的信息是否为空,可以用javascript实现。比如验证是否包含非法字符%,只要客户端检查输入就好了。
问:那如何检查用户所有输入是否有非法字符?
答:用循环获得所有表单数据。

jsp内置对象是自动载入的,因此它们不需要直接实例化。

请求服务器的端口号的方法,可以做类似“检查IP以220开头的用户是非法用户”的事情。

web.xml可以设置欢迎页

servlet为了实现控制者这一角色,必须要能够实现跳转。

过滤器可以判断用户类型,管理员、普通用户。